﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	//struct S s = { "大头", 20, 188.8f };
//	struct S s = { 0 };
//	FILE* p = fopen("test.txt", "r");
//	if (p == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 写文件--以文本形式写进去
//	//fprintf(p, "%s %d %f", s.name, s.age, s.score);
//	printf("%s %d %f\n", s.name, s.age, s.score);
//	//读文件--放入结构体里面
//	fscanf(p, "%s %d %f", &(s.name), &(s.age), &(s.score));
//	printf("%s %d %f\n", s.name, s.age, s.score);
//	fprintf(stdout, "%s %d %f\n", s.name, s.age, s.score);
//	fclose(p);
//	p = NULL;
//	return 0;
///}

//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	char arr[300] = { 0 };
//	struct S s = { "大头", 20, 188.8f };
//
//	//把结构体里的数据转换为字符格式存储在数组arr里面
//	sprintf(arr, "%s %d %f\n", s.name, s.age, s.score);
//	struct S h = { 0 };
//	//以字符串形式打印
//	printf("%s\n", arr);
//	//以格式化读取数据到arr里面
//	sscanf(arr, "%s %d %f", &(h.name), &(h.age), &(h.score));
//	//以格式打印
//	printf("%s %d %f", h.name, h.age, h.score);
//	return 0;
//}

//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	FILE* p = fopen("test.txt", "wb");
//	if (p == NULL)
//	{
//		perror("fopen");
//	}
//	//以二进制形式写数据
//	fwrite(arr, sizeof(int), 5, p);
//
//	//关闭文件
//	fclose(p);
//	p = NULL;
//	return  0;
//}

//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	FILE* p = fopen("test.txt", "rb");
//	if (p == NULL)
//	{
//		perror("fopen");
//	}
//	//以二进制读数据
//	fread(arr, sizeof(int), 5, p);//从p里面读大小为int的5个(不够5个时候有几个读几个)数据放入arr里面去
//	for (int i = 0; i < 5; ++i)
//	{
//		printf("%d ", arr[i]);
//	}
//	
//	//关闭文件
//	fclose(p);
//	p = NULL;
//	return  0;
//}

//int main()
//{
//	FILE* p = fopen("test.txt", "r");
//	if (p == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	int ch = fgetc(p);
//	printf("%c\n", ch);
//
//	//每次读完光标都会移动一个位置
//	ch = fgetc(p);
//	printf("%c\n", ch);
//
//	//从光标所字位置作起始位置，偏移2个位置
//	fseek(p, 2, SEEK_CUR);
//	ch = fgetc(p);
//	printf("%c\n", ch);
//
//	//关闭文件
//	fclose(p);
//	p = NULL;
//	return 0;
//}

//int main()
//{
//	FILE* p = fopen("test.txt", "r");
//	if (p == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	long int a = 0;
//	int ch = fgetc(p);
//	printf("%c\n", ch);
//
//	//每次读完光标都会移动一个位置
//	ch = fgetc(p);
//	printf("%c\n", ch);
//
//	a = ftell(p);
//	printf("%d\n", a);	
//
//	//从光标所字位置作起始位置，偏移2个位置
//	fseek(p, 2, SEEK_CUR);
//	ch = fgetc(p);
//	printf("%c\n", ch);
//
//	a = ftell(p);
//	printf("%d\n", a);
//
//	//关闭文件
//	fclose(p);
//	p = NULL;
//	return 0;
//}

//int main()
//{
//	FILE* p = fopen("test.txt", "r");
//	if (p == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	//读取
//	int ch = 0;
//	while ((ch = fgetc(p)) != EOF)
//	{
//		printf("%c", ch);
//	}
//	printf("\n");
//	//判断是什么原因导致读取结束
//	if (feof(p))
//	{
//		printf("遇到文件末尾，读取正常结束\n");
//	}
//	else if (ferror(p))
//	{
//		//打印导致异常结束的原因
//		perror("fgetc");
//	}
//	return 0;
//}

//int main()
//{
//	FILE* p = fopen("hh.txt", "r");
//	if (p == NULL)
//	{
//		perror("fopen:hh.txt");
//		return 1;
//	}
//	FILE* k = fopen("kk.txt", "w");
//	if (k == NULL)
//	{
//		fclose(p);
//		p = NULL;
//		perror("fopen:kk.txt");
//		return 1;
//	}
//	//读文件和写文件
//	int ch = 0;
//	while ((ch = fgetc(p))/*读文件*/ != EOF)
//	{
//		fputc(ch, k);//写文件
//	}
//	fclose(p);
//	p = NULL;
//	fclose(k);
//	k = NULL;
//
//	return 0;
//}

#include<windows.h>

//int main()//莫名好喜欢这个代码
//{
//	FILE* pf = fopen("test.txt", "w");
//	fputs("hello world", pf);//先将代码放在输出缓冲区
//	printf("睡眠3秒-已经写数据了，打开test.txt⽂件，发现⽂件没有内容\n");
//	Sleep(3000);
//	printf("刷新缓冲区\n");
//	fflush(pf);//刷新缓冲区时，才将输出缓冲区的数据写到⽂件（磁盘）
//	//注：fflush 在⾼版本的VS上不能使⽤了
//	printf("再睡眠3秒-此时，再次打开test.txt⽂件，⽂件有内容了\n");
//	Sleep(3000);
//	fclose(pf);
//	//注：fclose在关闭⽂件的时候，也会刷新缓冲区
//	pf = NULL;
//	return 0;
//}

//int add(int, int);
//int main()
//{
//	int a = 145;
//	int b = 20;
//	int c = add(a, b);
//	printf("%d\n", c);
//	return 0;
//}

//以下为作业代码，冲冲冲！！！

//使用所学文件操作，在当前目录下放一个文件data.txt，写一个程序，将data.txt文件拷贝一份，
//生成data_copy.txt文件。
//基本思路：
//打开文件data.txt，读取数据
//打开文件data_copy.txt，写数据
//从data.txt中读取数据存放到data_copy.txt文件中，直到文件结束。
//关闭两个文件

//int main()
//{
//	FILE* p = fopen("data.txt", "r");
//	if (p == NULL)
//	{
//		perror("fopen:data.txt");
//		return 1;
//	}
//	FILE* k = fopen("data_copy.txt", "w");
//	if (k == NULL)
//	{
//		fclose(p);
//		p = NULL;
//		perror("fopen:data_copy");
//		return 1;
//	}
//	int ch = 0;
//	while (((ch = fgetc(p)) != EOF))
//	{
//		fputc(ch, k);
//	}
//
//	fclose(p);
//	p = NULL;
//	fclose(k);
//	k = NULL;
//	return 0;
//}

//#define INT_PTR int*
//typedef int* int_ptr;
//INT_PTR a, b;
//int_ptr c, d;

//以下为课堂代码

//int main()
//{
//	printf("%s\n", __FILE__);//进行编译的源文件
//	printf("%d\n", __LINE__);//当前行号
//	printf("%s\n", __DATE__);//编译的日期
//	printf("%s\n", __TIME__);//编译时间
//
//	return 0;
//}

//#define AXX "Hello World!"
//
//int main()
//{
//	printf("%s\n", AXX);
//	return 0;
//}

//define的替换都非常无脑，直接纯粹的文本替换,在定义的时候最好把每一个元素以及整体都括起来
//#define ASS(x) x * x
//#define MAX(x, y) ((x > y) ? (x) : (y))
//#define X 10
//
//int main()
//{
//	int a = 6;
//	int b = 4;
//	int m = MAX(a, MAX(123, X));
//	printf("%d\n", a);
//	printf("%d\n", X);
//	printf("%d\n", MAX(123, X));
//	printf("%d\n", m);
//	return 0;
//}

//#define MAX(a , b) ((a) > (b) ? (a) : (b))
//
//int maxx(int x, int y)
//{
//	return (x > y ? x : y);
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int m1 = MAX(a, b);
//	int m2 = maxx(a, b);
//	printf("%d %d\n", m1, m2);
//	return 0;
//}

//int main()
//{
//	printf("%s\n", "hello"   "world");
//	return 0;
//}

//#define AXX(n, x) printf(""#n" this is "x"\n", n);//操作符#把n字符串化了
//int main()
//{
//	int a = 1;
//	AXX(a, "%d");
//	//printf("a is %d\n", a);
//
//	int b = 20;
//	AXX(b, "%d");
//	
//	int f = 3.14f;
//	AXX(f, "%f");
//	return 0;
//}

//#define AXX(type) type type##_max(type x, type y)\
//{\
//	return x > y ? x : y;\
//}
//
////定义相似函数
//AXX(int);
//AXX(double);
//int main()//wokao简直不要太牛掰
//{
//	int i = int_max(12, 45);
//	double j = double_max(15.2, 3.145);
//	printf("%d %lf\n", i, j);
//	return 0;
//}

//#define AXX 100
//
//int main()
//{
//	printf("%d\n", AXX);
//#undef AXX
//	printf("%d\n", AXX);//已经移出宏定义，所以会报警
//	return 0;
//}

//#define M 1;
//
//int main()
//{
//#if M > 0//条件编译--真/假
//	printf("hello world!");
//#endif
//
//	return 0;
//}

//#define M 1
//
//int main()//分支结构的条件编译
//{
//#if M == 0
//	printf("hehn\n");
//#elif M == 1
//	printf("大头\n");
//#endif
//	return 0;
//}

//#define MAX 0

//int main()
//{
////#if defined(MAX)
////	printf("已经定义\n");
////#endif
//#ifdef MAX//与上面代码效果一样
//	printf("已经定义\n");
//#endif
//	return 0;
//}

int main()
{

	return 0;
}